const express = require('express');
const axios = require('axios');
const router = express.Router();
const request = require('request');
const fs = require('fs');
const mysql = require('mysql');
const multer = require('multer');
const path = require('path');
const bodyParser = require('body-parser');
const app = express();
const { spawn } = require('child_process');
const PORT = process.env.PORT || 3000;

const cors = require('cors');
// 允许所有来源的跨域请求
app.use(cors());

//用于解析form-data数据
const multipart = require('connect-multiparty');
const multipartyMiddleware = multipart();

//用于解析x-www-form-urlencoded形式的表单数据
app.use(bodyParser.urlencoded({ extended: false }));

// 设置存储文件的目录和文件名
const storageBaidu = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, 'BaiduUploads'); // 图片存储在 BaiduUploads 目录下
    },
    filename: function(req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

const storageImage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, 'image'); // 图片存储在 image 目录下
    },
    filename: function(req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

// 初始化Multer
const uploadBaidu = multer({ storage: storageBaidu });
const uploadImage = multer({ storage: storageImage });

// 静态文件目录
app.use(express.static('public')); 


// 解析 JSON 请求体
app.use(express.json());


// 创建数据库连接
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'itisraining',
    database: 'web_project'
});

// 连接到数据库
connection.connect(err => {
    if (err) {
        console.error('Database connection failed: ' + err.stack);
        return;
    }
    console.log('Connected to database.');
});

// 路由

// 执行python子进程的路由
app.get('/run-python-script', (req, res) => {
    // 创建一个子进程来运行 Python 脚本
    const pythonProcess = spawn('python', ['script.py']);

    // 捕获标准输出
    pythonProcess.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
        // 将输出发送给客户端
        res.send(data.toString());
    });

    // 捕获标准错误输出
    pythonProcess.stderr.on('data', (data) => {
        console.error(`stderr: ${data}`);
        // 发送错误消息给客户端
        res.status(500).send(data.toString());
    });

    // 脚本结束
    pythonProcess.on('close', (code) => {
        console.log(`子进程退出，退出码 ${code}`);
    });
});

// 处理图片上传并调用百度AI接口
app.post('/process-image', uploadBaidu.single('image'), (req, res) => {
    // 获取上传的图片文件路径
    const imagePath = req.file.path;

    // 将图片文件转换为 Base64 编码
    const imageBase64 = getFileContentAsBase64(imagePath);

    // 设置百度AI接口请求参数
    const options = {
        method: 'POST',
        url: 'https://aip.baidubce.com/rest/2.0/image-classify/v1/animal?access_token=24.86ff7619ab855b47e74c5803a149bb8f.2592000.1715764179.282335-61554727',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'
        },
        form: {
            'image': imageBase64
        }
    };

    //console.log('Response:', res.body);

    // 发送请求到百度AI接口
    request(options, function (error, response) {
        if (error) {
            console.error('Error:', error);
            res.status(500).json({ error: 'An error occurred' });
        } else {
            console.log('Response:', response.body);
            res.json(response.body)
            
        }
    });
});

/**
 * 获取文件base64编码
 * @param string  path 文件路径
 * @return string base64编码信息，不带文件头
 */
function getFileContentAsBase64(path) {
    try {
        return fs.readFileSync(path, { encoding: 'base64' });
    } catch (err) {
        throw new Error(err);
    }
}

// 注册路由
app.post('/register', multipartyMiddleware, (req, res) => {
    const { username, password } = req.body;

    // 查询用户名是否已经存在
    connection.query(`SELECT * FROM users WHERE username = '${username}'`,  (err, results) => {
        if (err) {
            console.error('Error querying database: ' + err.stack);
            res.status(500).send('Internal server error');
            return;
        }

        // 如果用户名已经存在，则返回注册失败
        if (results.length > 0) {
            res.status(409).send('Username already exists');
        } else {
            // 否则，将用户数据插入到数据库中
            connection.query('INSERT INTO users (username, password) VALUES (?, ?)', [username, password], (err, results) => {
                if (err) {
                    console.error('Error inserting into database: ' + err.stack);
                    res.status(500).send('Internal server error');
                    return;
                }
                res.status(200).send('Registration successful');
            });
        }
    });
});

// 登录路由
app.post('/login', multipartyMiddleware, (req, res) => {
    const { username, password } = req.body;

    // 查询数据库验证用户信息
    connection.query('SELECT * FROM users WHERE username = ? AND password = ?', [username, password], (err, results) => {
        if (err) {
            console.error('Error querying database: ' + err.stack);
            res.status(500).send('Internal server error');
            return;
        }

        // 如果查询结果为空，则表示用户名或密码错误
        if (results.length === 0) {
            res.status(401).send('Unauthorized');
        } else {
            res.status(200).send('Login successful');
        }
    });
});

app.get('/logout', (req, res) => {
    // Implement user logout logic
    res.send('This is /logout page!')
});

// 路由：获取用户数据
app.get('/users', (req, res) => {
    // 查询数据库中的用户数据
    connection.query('SELECT * FROM users', (err, results) => {
        if (err) {
            console.error('Error querying database: ' + err.stack);
            res.status(500).json({ error: 'Error querying database' });
            return;
        }
        // 将查询结果以JSON格式返回给前端
        res.json(results);
        //console.log('数据已发送')
    });
});

// 路由：获取所有声呐数据
app.get('/data/all', (req, res) => {
    // 查询数据库获取所有数据
    const query = 'SELECT * FROM parameter';
    connection.query(query, (err, results) => {
        if (err) {
            console.error('Error querying database:', err);
            res.status(500).send('Internal Server Error');
            return;
        }
        res.json(results);
    });
});

//查找路由
app.get('/parameters', (req, res) => {
    const targetCategory = req.query.targetCategory;

    // Fetch parameter data from database based on target category
    // Implement database query logic here

    res.status(200).json(/* Query result */);
});

//添加数据路由
app.post('/add-data', uploadImage.single('image'), (req, res) => {
    // 获取表单数据。注意请求体中的字段要和下面列的字段名字一样
    const { category, status, longitude, latitude, area, channelLevel, channelName, device, operationTime } = req.body;
    const inputTime = new Date().toISOString().slice(0, 19).replace('T', ' '); // 当前时间
    const imagePath = `${req.file.filename}`; // 图片存放路径

    // 构建插入数据的SQL语句
    const sql = `INSERT INTO parameter (目标物类别, 目标物状态, 经度信息, 纬度信息, 地区信息, 航道等级, 航道名称, 检测数据, 检测设备, 录入时间, 作业时间) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;

    // 执行插入数据的SQL语句
    connection.query(sql, [category, status, longitude, latitude, area, channelLevel, channelName, imagePath, device, inputTime, operationTime], (err, results) => {
        if (err) {
            console.error('数据插入失败:', err);
            res.status(500).json({ message: '数据插入失败' });
            return;
        }
        console.log('数据插入成功');
        res.json({ message: '数据添加成功' });
    });
});

// 获取数据路由
app.get('/get-data/:id', (req, res) => {
    const id = req.params.id;
    const sql = 'SELECT * FROM parameter WHERE id = ?';
    connection.query(sql, [id], (err, results) => {
        if (err) {
            console.error('获取要编辑的数据失败:', err);
            res.status(500).json({ message: '获取要编辑的数据失败' });
            return;
        }
        if (results.length === 0) {
            res.status(404).json({ message: '未找到要编辑的数据' });
            return;
        }
        const data = results[0]; // 假设只返回一条数据
        res.json(data);
    });
});

// 处理待编辑数据的路由
app.post('/update-data/:id', uploadImage.single('image'), (req, res) => {
    const id = req.params.id; // 获取要编辑的数据的ID
    //下面如果只用一个newData接收，用newData.目标物类别的方式会显示数据都是undefined，不知为什么
    const { category, status, longitude, latitude, area, channelLevel, channelName, device, operationTime } = req.body;
    const imagePath = `${req.file.filename}`; // 新图片存放路径
    const inputTime = new Date().toISOString().slice(0, 19).replace('T', ' '); // 当前时间

    // 构建更新数据的SQL语句
    const sql = `UPDATE parameter SET 目标物类别=?, 目标物状态=?, 经度信息=?, 纬度信息=?, 地区信息=?, 航道等级=?, 航道名称=?, 检测数据=?, 检测设备=?, 录入时间=?, 作业时间=? WHERE id=?`;

    // 执行更新数据的SQL语句
    connection.query(sql, [category, status, longitude, latitude, area, channelLevel, channelName, imagePath, device, inputTime, operationTime,id], (err, results) => {
        if (err) {
            console.error('编辑数据失败:', err);
            res.status(500).json({ message: '编辑数据失败' });
            return;
        }
        console.log('编辑数据成功');
        res.json({ message: '编辑数据成功' });
        //res.json(newData)
        console.log(category)
        console.log(imagePath)
    });
});

// 处理DELETE请求，删除数据
app.delete('/delete-data/:id', (req, res) => {
    const id = req.params.id;

    // 构建删除数据的SQL语句
    const sql = `DELETE FROM parameter WHERE id = ?`;

    // 执行删除数据的SQL语句
    connection.query(sql, [id], (err, results) => {
        if (err) {
            console.error('数据删除失败:', err);
            res.status(500).json({ message: '数据删除失败' });
            return;
        }
        console.log('数据删除成功');
        res.json({ message: '数据删除成功' });
    });
});

app.get('/', (req, res) => {
    res.send('This is / page!')
});


// Start server
app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});
